﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rechner_mit_Foreach
{
    class Program
    {
        static void Main(string[] args)
        {
            var RechnungList = new List<Rechnung>();

            string StrValue = string.Empty;
            string input = "";
            string StrNummer = string.Empty;
            string StrSymbol = string.Empty;
            string tempNumber = string.Empty;
            string tempSymbole = string.Empty;
            string punkt = string.Empty;
            string weiter = string.Empty;
            do
            {

                Console.WriteLine("Eingabe: ");
                input = Console.ReadLine();

                Rechnung re = new Rechnung();
                string rtn = re.Berechnung(input);
                Console.WriteLine("Ergebnis: " + rtn);


                Console.WriteLine("Neue rechnung? (j/n)");
                weiter = Console.ReadLine();
                

            } while (weiter.Contains('j') || weiter.Contains('J'));
        } //Main ende
    } //class Program ende

    

    public class Rechnung
    {
        



        public string Berechnung (string input)
        {

            string tempNumber = string.Empty;
            string tempSymbole = string.Empty;
            string punkt = string.Empty;
            //int indexIstPunkt = -2;
            //int indexIstStrich = -2;
            int index = -2;
            string rtn = string.Empty;
            double temp = 0;

            List<String> ZahlenListeRechnen = new List<string>();

            List<String> OperantenListe = new List<string>();
            

            foreach (char Character in input.ToCharArray())
            {
                if (Char.IsNumber(Character))
                {

                    tempNumber += Character.ToString();


                } // if ende
                else if (Char.IsSymbol(Character) || Char.IsPunctuation(Character))
                {


                    //ZahlenListeRechnen.Add(tempNumber);

                    tempSymbole += Character.ToString();

                    ZahlenListeRechnen.Add(tempNumber);
                    OperantenListe.Add(tempSymbole);

                    tempNumber = string.Empty;
                    tempSymbole = string.Empty;
                } //else if ende

                

            } //foreach ende
            ZahlenListeRechnen.Add(tempNumber);
            List<double> ZahlenDouble = ZahlenListeRechnen.ConvertAll(item => double.Parse(item));
            do
            {

                index = OperantenListe.FindIndex(IstPunkt);


                if (index != -1)
                {
                    string PunktCase = OperantenListe[index];
                    switch (PunktCase)
                    {
                        case "*":
                            temp = ZahlenDouble[index] * ZahlenDouble[index + 1];
                            Console.WriteLine(ZahlenDouble[index] + OperantenListe[index] + ZahlenDouble[index + 1] + " = " + temp);
                            break;

                        case "/":
                            temp = ZahlenDouble[index] / ZahlenDouble[index + 1];
                            Console.WriteLine(ZahlenDouble[index] + OperantenListe[index] + ZahlenDouble[index + 1] + " = " + temp);
                            break;
                    } //switch ende

                    ZahlenDouble.Insert(index, temp);

                    ZahlenDouble.RemoveAt(index + 1);
                    ZahlenDouble.RemoveAt(index + 1);
                    OperantenListe.RemoveAt(index);

                } // if ende
                else
                {
                    index = 0;
                    index = OperantenListe.FindIndex(IstStrich);
                    string StrichCase = OperantenListe[index];
                    switch (StrichCase)
                    {
                        case "+":
                            temp = ZahlenDouble[index] + ZahlenDouble[index + 1];
                            Console.WriteLine(ZahlenDouble[index] + OperantenListe[index] + ZahlenDouble[index + 1] + " = " + temp);
                            break;

                        case "-":
                            temp = ZahlenDouble[index] - ZahlenDouble[index + 1];
                            Console.WriteLine(ZahlenDouble[index] + OperantenListe[index] + ZahlenDouble[index + 1] + " = " + temp);
                            break;
                    } // switch ende

                    ZahlenDouble.Insert(index, temp);

                    ZahlenDouble.RemoveAt(index + 1);
                    ZahlenDouble.RemoveAt(index + 1);
                    OperantenListe.RemoveAt(index);
                } // else if ende

            } while (index >= 0);

            rtn = Convert.ToString(temp);
            return rtn;

        } // Berechnung ende

        private static bool IstPunkt(string p)
        {
            if (p == "*" || p == "/")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private static bool IstStrich(string st)
        {
            if (st == "+" || st == "-")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    } // Class Rechnung ende
       

            
            

} //namespace ende

